fun main() {

//    val at: ApplyTest = ApplyTest().name("zhang").age(18)
//    println("姓名:${at.name} 年龄:${at.age}")
    //输出: 姓名:zhang 年龄:18

    alsoFun()
}

fun alsoFun() {
    val str = "hello"
    val len = str.also {
        println(it)
    }.apply {
        println("$this world")
    }.let {
        "$it world"
    }.length

    println(len.toString())

    /*
    输出:
    hello
    hello world
    11
     */
}

//使用构造函数的默认构造参数定义,加上var会自动生成属性
class ApplyTest constructor(var name: String = "kotlin", var age: Int = 9) {

    //以下两种方法写法等价
    fun name(name: String): ApplyTest {
        return apply {
            this.name = name
        }
    }

    fun age(age: Int) = apply {
        this.age = age
    }
}

fun runFun() {

    val str = "hello".run {
        length.toString()
    }

    println(str)//输出:5
}

fun withFun() {
    val str = with("你好") {
        "长度:${length} 翻译:hello"
    }

    println(str)//长度:2 翻译:hello
}